package com.atguigu.polymophism;

public class TestClassCast {
    public static void main(String[] args) {
        //double d = 1;
        Animal a = new Dog(); //向上转型
        a.eat();//编译器把a定为Animal类型，只能调用Animal中有的方法，Animal没有子类有的方法，调不了
//        a.watchHouse();//报错

        //如果希望上面的对象调用Dog类中扩展的新方法，只能将其向下转型
        //int a = (int)d;
       /* Dog d = (Dog) a;//向下转型，需要强制进行
        d.eat();
        d.watchHouse();*/

        /*Cat c = (Cat) a;//向下转型。编译时a以Animal类型处理，那么Animal是Cat的父类，所以可以向下转型。
        //上面这句代码发生了运行时异常，它是ClassCastException类型转换异常。
        // 因为实际上a指向的是Dog对象，Dog与Cat之间是兄弟关系，不能强转。
        //即向下转型要小心，可能有风险。
        c.eat();
        c.catchMouse();*/

       /* if(a instanceof Dog){//instanceof，判断a中的对象是不是Dog类型的实例对象
            Dog d = (Dog) a;//向下转型，需要强制进行
            d.eat();
            d.watchHouse();
        }else if(a instanceof Cat){
            Cat c = (Cat) a;
            c.eat();
            c.catchMouse();
        }*/

        //这里有一个新特性：模式匹配
        if(a instanceof Dog d){//instanceof，判断a中的对象是不是Dog类型的实例对象
            d.eat();
            d.watchHouse();
        }else if(a instanceof Cat c){
            c.eat();
            c.catchMouse();
        }
        System.out.println("=============================");
        //总结：当a变量中实际new的对象的类型 <= instanceof后面判断的类型，结果就是true
        System.out.println(a instanceof Dog);//true
        System.out.println(a instanceof Animal);//true
        System.out.println(a instanceof Object);//true
        System.out.println(a instanceof Cat);//false
        System.out.println(a instanceof Husky);//false
    }
}
